import promise from './promise.js'
console.log('promise:',promise)
/**
 * 日期格式化
 * @param{Date} date 日期
 */
export formatTime = date => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()

  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}

const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}
/*   计算时间间隔
 *   @param{string} - interval,字符串表达式，表示要添加的时间间隔类型.
 *   @param{Number} - number,数值表达式，表示要添加的时间间隔的个数.
 *   @param{Date} - date起始时间对象.
 *   @return{Date} - 新的时间对象
 *   let now = new Date();
 *   let newDate = DateAdd( "d", 5, now);
 *---------------   DateAdd(interval,number,date)   -----------------
 */
export DateAdd = (interval, number, date) => {
  switch (interval) {
    case "y":
      {
        date.setFullYear(date.getFullYear() + number);
        return date;
        break;
      }
    case "q":
      {
        date.setMonth(date.getMonth() + number * 3);
        return date;
        break;
      }
    case "M":
      {
        date.setMonth(date.getMonth() + number);
        return date;
        break;
      }
    case "w":
      {
        date.setDate(date.getDate() + number * 7);
        return date;
        break;
      }
    case "d":
      {
        date.setDate(date.getDate() + number);
        return date;
        break;
      }
    case "h":
      {
        date.setHours(date.getHours() + number);
        return date;
        break;
      }
    case "m":
      {
        date.setMinutes(date.getMinutes() + number);
        return date;
        break;
      }
    case "s":
      {
        date.setSeconds(date.getSeconds() + number);
        return date;
        break;
      }
    default:
      {
        date.setDate(d.getDate() + number);
        return date;
        break;
      }
  }
}

export getDurationTime = (dateType, formatType) => {
  const that = this;
  var now = new Date();
  var nowDayOfWeek = now.getDay(); //今天本周的第几天
  var nowDay = now.getDate(); //当前日
  var nowMonth = now.getMonth(); //当前月

  var nowYear = now.getYear(); //当前年

  nowYear += (nowYear < 2000) ? 1900 : 0; //

  var lastMonthDate = new Date(); //上月日期
  lastMonthDate.setDate(1);
  lastMonthDate.setMonth(lastMonthDate.getMonth() - 1);
  var lastYear = lastMonthDate.getYear();
  var lastMonth = lastMonthDate.getMonth();


  var nextMonthDate = new Date(); //下个月
  nextMonthDate.setDate(1);
  nextMonthDate.setMonth(nextMonthDate.getMonth() + 1);
  var nextYear = nextMonthDate.getYear();
  var nextMonth = nextMonthDate.getMonth();

  var format = formatType || 0;

  //获得某月的天数
  var getMonthDays = function(myMonth) {
    var monthStartDate = new Date(nowYear, myMonth, 1);
    var monthEndDate = new Date(nowYear, myMonth + 1, 1);
    var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
    return days;
  }

  var duration = null;
  switch (dateType) {
    case 0: //今天
      duration = formatDate(now, format);
      break
    case 1: //昨天
      now.setDate(now.getDate() - 1);
      duration = formatDate(now, format);
      break;
    case 3: //明天
      now.setDate(now.getDate() + 1);
      duration = formatDate(now, format);
      break;
    case 4: //后天
      now.setDate(now.getDate() + 2);
      duration = formatDate(now, format);
      break;
    default:
      duration = formatDate(now); //默认今天
  }
  return duration;
}

export getWeekDay = (date) => {
  var weekDay = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  return weekDay[new Date(Date.parse(date)).getDay()]
}

/**
 * 手机号验证
 * @param {string}- phoneNum 
 * @return{boolean}- true 验证通过，false 验证不通过
 */
export regPhone = (phoneNum) => {
  const reg = new RegExp("^1[0-9][0-9]{9}$");

  return reg.test(phoneNum);
}
/**
 * 身份证验证
 * @param {string}-card 身份证号码
 * @return {boolean}-true 验证通过，false 验证不通过
 */
export regIDCard = (card) => {
  const reg = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$|^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/;
  return reg.test(card);
}

/**
 * 邮箱验证
 * @param  {string} email 邮箱
 * @return {boolean} true 验证通过,false 验证不通过
 * @example 
 * console.log(regEmail(email))
 */
export regEmail = (email) => {
  const reg = new RegExp("^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$");

  return reg.test(email)
}

/**
 * 验证电话是否合法
 * @param{string} telePhonestr 电话号码
 * @return true为合法 false为不合法
 */
export checkTelePhone(telePhonestr) {
  var pattern = new RegExp("^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$");
  return pattern.test(telePhonestr);
}
/**
 * 日期格式化 
 * @params{string} -日期格式 如：yyyy-mm-dd
 * @return {string} fmt-字符串类型的日期 
 */
Date.prototype.Format = function(fmt) {
  let o = {
    "M+": this.getMonth() + 1, //月份
    "d+": this.getDate(), //日
    "h+": this.getHours(), //小时
    "m+": this.getMinutes(), //分
    "s+": this.getSeconds(), //秒
    "q+": Math.floor((this.getMonth() + 3) / 3), //季度
    "S": this.getMilliseconds() //毫秒
  };

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  }
  for (var k in o) {
    if (new RegExp("(" + k + ")").test(fmt))
      fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  }
  return fmt;
}
/**
 * @params {string}-d 传入日期
 * @params {string}-fmt 目标格式 如：yyyy-MM-dd （小程序不要使用 ‘-’格式的，兼容性问题，ios会报错，用‘/’代替）
 * @return {string}-参数d合法时返回日期
 * @return {string}-参数d不合法使返回 ''
 */
export formatDate = (d, fmt) => {
  if (typeof d == 'string' && d != "") {
    switch (fmt) {
      case 0:
        fmt = 'yyyy-MM-dd';
        break;
      case 1:
        fmt = 'yyyy.MM.dd';
        break;
      case 2:
        fmt = 'yyyy-MM';
        break;
      case 3:
        fmt = 'MM-dd';
        break;
      case 4:
        fmt = 'yyyy-MM-dd hh:mm';
        break;
      case 5:
        fmt = 'MM月dd日';
        break;
    }
    let reg = new RegExp(/-/g);
    return new Date(d.replace(reg, "/")).Format(fmt)
  } else
    return ''
}

/**
 * 获取当前页面的路径层级
 * @return{string} - url 页面路径层级
 */
export getRelativePath = () => {
  const length = getCurrentPages().length;
  const currentRoute = getCurrentPages()[length - 1].route;
  const pathIndex = currentRoute.split('/').length;
  let url = ""
  for (let i = 0; i < pathIndex - 1; i++) {
    url += '../'
  }
  return url
}

//过滤汉字
export  removeChinese = (strValue) => {    
  if (strValue !=  null  &&  strValue  !=  "") {        
    var  reg  =  /[\u4e00-\u9fa5]/g;       
    return  strValue.replace(reg, "");    
  }    
  else        
    return  "";
}
//去除特殊字符
export filterSpecialStr = (str) => {
  var value = str.replace(/[\-\_\,\!\|\~\`\(\)\#\$\%\^\&\*\{\}\:\;\"\'\，\“\”\、\！\？\L\<\>\?]/g, ''); 
  return value;
}
/**
 * 获取当前位置坐标
 */
export getCurLocation = () => {
  let getLocation = promise.uniPromise(uni.getLocation());
  return getLocation({
      type: 'gcj02'
    })
    .then(res => {
      // console.log(res)
      return Promise.resolve({
        latitude: res.latitude,
        longitude: res.longitude
      })
    })
}


/**
 * 函数节流
 * @param {function} - func 需要做节流的函数
 * @parm {number} - wait 等待多久后再次触发
 * @return {function} -节流函数
 */
export throttle = (func, wait) => {
  let lastTime = null;
  let timeOut;
  return function() {
    let context = this;
    let now = +new Date();
    if (now - lastTime - wait > 0) {
      if (timeOut) {
        clearTimeout(timeOut);
        timeOut = null;
      }
      func.apply(context, arguments);
      lastTime = now;
    } else if (!timeOut) {
      timeOut = setTimeout(() => {
        func.apply(context, arguments)
      }, wait)
    }
  }
}

/**
 * 函数去抖
 * @param {function} - func 函数方法
 * @param {wait} - 设置去抖时间 
 * @return {function} - 去抖函数
 */
const debounce = (func, wait) => {
  let lastTime = 0;
  let timeout;
  return function() {
    let context = this;
    let now = +new Date();
    if (now - lastTime - wait > 0) {
      setTimeout(() => {
        func.apply(context, arguments);
      }, wait)
    } else {
      if (timeout) {
        clearTimeout(timeout)
        timeout = null;
      }
      timeout = setTimeout(() => {
        func.apply(context, arguments);
      }, wait)
    }
    lastTime = now;
  }
}

/**
 * uri 编码
 */
const encodeUri = (uri) => {
  return encodeURIComponent(uri);
}
/**
 * uri 逆解析
 */
const decodeUri = (uri) => {
  return decodeURIComponent(uri)
}

/**
 * 检测当前的小程序
 * 是否是最新版本，是否需要下载、更新
 */
const checkUpdateVersion = () => {
  //判断微信版本是否 兼容小程序更新机制API的使用
  if (uni.canIUse('getUpdateManager')) {
    //创建 UpdateManager 实例
    const updateManager = uni.getUpdateManager();
    //检测版本更新
    updateManager.onCheckForUpdate(function(res) {
      // 请求完新版本信息的回调
      if (res.hasUpdate) {
        //监听小程序有版本更新事件
        updateManager.onUpdateReady(function() {
          //TODO 新的版本已经下载好，调用 applyUpdate 应用新版本并重启 （ 此处进行了自动更新操作）
          updateManager.applyUpdate();
        })
        updateManager.onUpdateFailed(function() {
          // 新版本下载失败
          uni.showModal({
            title: '已经有新版本喽~',
            content: '请您删除当前小程序，到微信 “发现-小程序” 页，重新搜索打开哦~',
          })
        })
      }
    })
  } else {
    //TODO 此时微信版本太低（一般而言版本都是支持的）
    uni.showModal({
      title: '溫馨提示',
      content: '当前微信版本过低，无法使用该功能，请升级到最新微信版本后重试。'
    })
  }
}